Python笔记 | 数据合并

在python中,我们通常会遇到对矩阵或者数据框进行合并,这里我总结了一些numpy库和pandas库中合并数据的方法。

numpy中的数据合并

  • 基础知识介绍

     在介绍数据合并之前,先说明一下numpy中数组维数的一些需要注意的点:

  1. 数组[1,2,3,4]和数组[[1,2,3,4]]这两种是不一样的!前者是一维数组,它的shape是(4,);而后者是二维数组(通常我们可以当作矩阵),它的shape是(1,4),对应着矩阵1行四列。当然,两者之间是可以相互转化的,转化代码如下:
    import numpy as np
	a=np.array([1,2,3,4])
	b=np.array([[1,2,3,4]])
	A=a[np.newaxis,:]   ##np.newaxis根据在行或列的方向上添加维度
	B=b.ravel()   ##ravel()函数可以将多维数组拉平称为一维数组
  1. 三维数组的理解
    对于数组[[[1,2]],[3,4]]] ,它的shape是(2,1,2)。第一个维度代表:去掉最外层的括号后,里面共有矩阵的数目,也就是[[1,2]],[[3,4]]这两个矩阵;而第二、三维度对应着1行2列的矩阵维数
  • 数据合并

      首先,利用随机数创建两个随机数组,为了保证每次结果一样,并设置随机种子

	import numpy as np
	np.random.seed(4869)  #设置随机种子
	a=np.floor(10*np.random.random((2,3)))   ##生成二行三列随机数(0~1之间)矩阵并向下取整
	b=np.floor(np.random.normal(0,1,6)).reshape(2,3)   ##生成标准正态分布的随机数矩阵
	print('矩阵a:\n{}'.format(a))
	print('-'*10)
	print('矩阵b:\n{}'.format(b))
	--------------输出结果如下----------------
	矩阵a:
	[[5. 7. 0.]
	 [2. 3. 8.]]
	----------
	矩阵b:
	[[-2. -3. -3.]
 	[-2.  1.  1.]]

以下将介绍三种合并方法:

	#方法一 stack函数
	A=np.stack((a,b),axis=0)  #axis控制横/纵向合并
	B=np.stack((a,b),axis=1)
    print('纵向合并:\n{}'.format(A))
    print('数组A的维度:{}'.format(A.shape))
    print('-'*10)
    print('横向合并:\n{}'.format(B))
    print('数组B的维度:{}'.format(B.shape))
    -------------输出结果如下---------------
	纵向合并:
	[[[ 5.  7.  0.]
	  [ 2.  3.  8.]]
	
	 [[-2. -3. -3.]
	  [-2.  1.  1.]]]
	数组A的维度:(2, 2, 3)     ##直接在a矩阵的尾部新增矩阵b,组合成一个三维数组
	----------
	横向合并:
	[[[ 5.  7.  0.]
	  [-2. -3. -3.]]
	
	 [[ 2.  3.  8.]
	  [-2.  1.  1.]]]
	数组B的维度:(2, 2, 3)	##将原a,b矩阵对应行进行组合,组合一个三维数组

从上述结果来看,最终输出的是一个三维数组。如果我们仅仅是希望将两个矩阵进行横\纵向合并后还是矩阵,可以使用以下两个方法:

#方法二 vstack和hstack函数  (v和h分别代表vertical和horizontal)
	A=np.vstack((a,b))
	B=np.hstack((a,b))
	print('纵向合并:\n{}'.format(A))
	print('矩阵A的维度:{}'.format(A.shape))
	print('-'*10)
	print('横向合并:\n{}'.format(B))
	print('矩阵B的维度:{}'.format(B.shape))
	-------------输出结果如下-----------
	纵向合并:
	[[ 5.  7.  0.]
	 [ 2.  3.  8.]
	 [-2. -3. -3.]
	 [-2.  1.  1.]]
	矩阵A的维度:(4, 3)    
	----------
	横向合并:
	[[ 5.  7.  0. -2. -3. -3.]
	 [ 2.  3.  8. -2.  1.  1.]]
	矩阵B的维度:(2, 6)

#方法三 concatenate函数
	A=np.concatenate((a,b),axis=0)  
	B=np.concatenate((a,b),axis=1)
	print('纵向合并:\n{}'.format(A))
	print('矩阵A的维度:{}'.format(A.shape))
	print('-'*10)
	print('横向合并:\n{}'.format(B))
	print('矩阵B的维度:{}'.format(B.shape))
	------------输出结果------------------
	纵向合并:
	[[ 5.  7.  0.]
	 [ 2.  3.  8.]
	 [-2. -3. -3.]
	 [-2.  1.  1.]]
	矩阵A的维度:(4, 3)
	----------
	横向合并:
	[[ 5.  7.  0. -2. -3. -3.]
	 [ 2.  3.  8. -2.  1.  1.]]
	矩阵B的维度:(2, 6)
	
	#总结:方法二和方法三的效果是一样的。方法二的vstack对应着方法三的axis=0,hstack对应着axis=1

pandas中的数据合并

pandas中数据合并的方法有很多,例如concat,join,merge,append等函数,这里主要介绍常用的concat函数和append函数。

	#1.创建两个数据集data1,data2
	import pandas as pd
	import numpy as np
	np.random.seed(4869)
	data1=pd.DataFrame(np.arange(6).reshape(2,3),columns=['A','B','C'])
	data2=pd.DataFrame(np.ceil(10*np.random.random((2,3))),columns=['A','B','C'])  ##向上取整
	print('数据集data1:\n{}'.format(data1))
	print('-'*10)
	print('数据集data2:\n{}'.format(data2))
	-----------输出结果如下----------------
	数据集data1:
	   A  B  C
	0  0  1  2
	1  3  4  5
	----------
	数据集data2:
	     A    B    C
	0  6.0  8.0  1.0
	1  3.0  4.0  9.0
	
	#2.concat函数
	data_v=pd.concat([data1,data2],axis=0)
	data_h=pd.concat([data1,data2],axis=1)
	print('纵向合并:\n{}'.format(data_v))  ##注意:纵向合并的时候需要保持两个数据集的列名相同
	print('-'*10)
	print('横向合并:\n{}'.format(data_h))
	----------输出结果如下---------------
	纵向合并:
	     A    B    C
	0  0.0  1.0  2.0
	1  3.0  4.0  5.0
	0  6.0  8.0  1.0
	1  3.0  4.0  9.0
	----------
	横向合并:
	   A  B  C    A    B    C
	0  0  1  2  6.0  8.0  1.0
	1  3  4  5  3.0  4.0  9.0
	
	#!纵向合并的时候,前面的索引是保留了原数据集的索引.如果想让其重新排列,可设置ignore_index=True
	data_v=pd.concat([data1,data2],axis=0,ignore_index=True)
	print('纵向合并:\n{}'.format(data_v))
	-----------输出结果如下-------------
	纵向合并:
	     A    B    C
	0  0.0  1.0  2.0
	1  3.0  4.0  5.0
	2  6.0  8.0  1.0
	3  3.0  4.0  9.0
	
	#3.append函数(类似列表中的添加功能,直接在数据框的下方进行添加)
	df=data2.append(data1,ignore_index=True)
	print('append纵向合并:\n{}'.format(df))
	-----------输出结果如下----------------
	append纵向合并:
	     A    B    C
	0  6.0  8.0  1.0
	1  3.0  4.0  9.0
	2  0.0  1.0  2.0
	3  3.0  4.0  5.0

以上就是目前我学习到的数据合并的全部内容,随着学习深入,我会慢慢再来补充的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值